package _go

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil && l2 == nil {
		return nil
	}
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}

	if l1.Val > l2.Val {
		l2.Next = mergeTwoLists(l1, l2.Next)
		return l2
	} else {
		l1.Next = mergeTwoLists(l1.Next, l2)
		return l1
	}
	return nil
}

//哨兵模式
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil && l2 == nil {
		return nil
	}
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}
	next := &ListNode{} //结果链表

	res := next //哨兵 最终返回结果值
	for l1 != nil && l2 != nil {
		if l1.Val > l2.Val {
			next.Next = l2
			l2 = l2.Next
		} else {
			next.Next = l1
			l1 = l1.Next
		}
		next = next.Next
	}
	//res = tmp
	if l1 != nil {
		next.Next = l1
	}
	if l2 != nil {
		next.Next = l2
	}
	return res.Next
}
